﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LinqKit;
using FrameworkLib.Filters;
using GestionePolveri2.DAL;
using System.Data.Objects;

namespace GestionePolveriLib.BL.FilterBags
{
    public enum PolvereStatus
    {
        Tutte = 0,
        InRiordino,
        SottoScorta,
        GeneratoDaCorrezione
    }

    public enum PolvereTypes
    {
        Tutte = 0,
        Normali,
        XXXX
    }

    public enum LottoTypes
    {
        Tutti = 0,
        NonNulli,
        Nulli
    }

    public enum IndicazionePolvere
    {
        Tutte = 0,
        Ufficiale,
        Superata
    }

    public enum PianoLavori
    {
        Tutte = 0,
        PianoLavoriOnly
    }

    public class VerniciatoreScortaMinimaFilterBag : FilterBase<AnagPolveri>, IFilterBase
    {
        public string CodicePolvere { get; set; }
        public string Fornitore { get; set; }
        public PolvereTypes Tipo { get; set; }
        public LottoTypes TipoLotto { get; set; }
        public string ColoriAbbinati { get; set; }
        public string Famiglia { get; set; }
        public string TipologiaSM { get; set; }
        public string StatoPolvere { get; set; }

        public VerniciatoreScortaMinimaFilterBag()
        {

        }

        public override System.Linq.Expressions.Expression<Func<AnagPolveri, bool>> SetUpFilter()
        {
            var predicate = PredicateBuilder.True<AnagPolveri>();

            //if (this.UseDates)
            //{
            //    // aggiungi al filtro il controllo sulla data...
            //    predicate = predicate.And(im => (EntityFunctions.TruncateTime(im.DataMovimento) >= EntityFunctions.TruncateTime(this.PeriodFrom)) &&
            //                                     EntityFunctions.TruncateTime(im.DataMovimento) <= EntityFunctions.TruncateTime(this.PeriodTo));
            //}

            if (!string.IsNullOrWhiteSpace(Famiglia))
            {
                //string[] arInfo = Famiglia.Split(',');
                //int[] iarInfo = new int[arInfo.Length];
                //for (int i = 0; i < arInfo.Length; i++)
                //{
                //    iarInfo[i] = Convert.ToInt32(arInfo[i]);
                //}

                // questo era attivo
                predicate = predicate.And(im => im.FamiglieColoriXPolveri.Famiglie == Famiglia);
            }

            if (!string.IsNullOrWhiteSpace(ColoriAbbinati))
            {
                predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagColori.CodiceColore.Equals(ColoriAbbinati, StringComparison.InvariantCultureIgnoreCase)));
            }

            if (!string.IsNullOrWhiteSpace(CodicePolvere))
            {
                predicate = predicate.And(im => im.CodicePolvere.Equals(CodicePolvere, StringComparison.InvariantCultureIgnoreCase));
            }

            if (!string.IsNullOrWhiteSpace(Fornitore))
            {
                predicate = predicate.And(im => im.AnagFornitori.Descrizione.Equals(Fornitore, StringComparison.InvariantCultureIgnoreCase));
            }

            if (!string.IsNullOrWhiteSpace(TipologiaSM))
            {
                predicate = predicate.And(im => im.TipologieScortaMinimaPolvere.Codice.Equals(TipologiaSM, StringComparison.InvariantCultureIgnoreCase));
            }

            //if (!string.IsNullOrWhiteSpace(StatoPolvere))
            //{
            //    if (StatoPolvere.Replace(" ", string.Empty).Contains(PolvereStatus.SottoScorta.ToString()))
            //    {
            //        if (CodicePolvere != null)
            //        {
            //            predicate = predicate.And(im => (im.Prenotazioni.Where(p => p.AnagPolveri.CodicePolvere == CodicePolvere && !p.IsAnnullata).Select(p => p.Quantita).Sum() < im.ScortaMinima));
            //        }
            //        else
            //        {
            //            predicate = predicate.And(im => (im.Prenotazioni.Where(p => !p.IsAnnullata).Select(p => p.Quantita).Sum() < im.ScortaMinima));
            //        }
            //    }
            //    //predicate = predicate.And(im => im.TipologieScortaMinimaPolvere.Codice.Equals(TipologiaSM, StringComparison.InvariantCultureIgnoreCase));
            //}

            switch (Tipo)
            {
                case PolvereTypes.Tutte:
                    break;
                case PolvereTypes.Normali:
                    predicate = predicate.And(im => im.IsCodiceCustom == false);
                    break;
                case PolvereTypes.XXXX:
                    predicate = predicate.And(im => im.IsCodiceCustom == true);
                    break;
                default:
                    break;
            }

            switch (TipoLotto)
            {
                case LottoTypes.Tutti:
                    break;
                case LottoTypes.NonNulli:
                    predicate = predicate.And(im => im.Lotti.Sum(y => y.Giacenza) != 0); // .Any(y => y.Giacenza != 0));
                    break;
                case LottoTypes.Nulli:
                    predicate = predicate.And(im => im.Lotti.Sum(y => y.Giacenza) == 0); //.Any(y => y.Giacenza == 0));
                    break;
                default:
                    break;
            }

            return predicate;
        }

        private System.Linq.Expressions.Expression<Func<AnagPolveri, bool>> G1(string codiceColore)
        {
            System.Linq.Expressions.Expression<Func<AnagPolveri, bool>> retValue = null;

            GestionePolveriEntities ctx = new GestionePolveriEntities();
            var obj = from x in ctx.AnagPolveri
                      join y in ctx.ComposizioneColori on x.IDPolvere equals y.IDPolvere
                      join z in ctx.AnagColori on y.IDColore equals z.IDColore
                      where z.CodiceColore == codiceColore
                      select x;

            return retValue;
        }

        public override string ToTraceString()
        {
            string retValue = base.ToTraceString();

            StringBuilder sb = new StringBuilder(base.ToTraceString());

            sb.Append(FilterBagHelper.GetCodicePolvereTraceString(this.CodicePolvere));
            sb.Append(FilterBagHelper.GetCodiceColoreTraceString(this.ColoriAbbinati));
            sb.Append(FilterBagHelper.GetFamigliaTraceString(this.Famiglia));
            sb.Append(FilterBagHelper.GetFornitoreTraceString(this.Fornitore));
            sb.Append(FilterBagHelper.GetTipoTraceString(this.Tipo));
            sb.Append(FilterBagHelper.GetTipoLottoTraceString(this.TipoLotto));

            return sb.ToString();
        }
    }
}
